//#pragma once
//
//#include "malloc.h"
//
//namespace Ooganizer
//{	
//
//	enum ButtonState{BUTTON_UP,BUTTON_DOWN};
//
//	//////////////////////////////////////////////////////////////////////
//	// Clss: HookItem
//	// Desc: Hook Item is used in the HookList. Each HookItem keeps track
//	//		 of all the addresses needed for each hook, as well as the 
//	//		 hookstate.
//	//
//	// Note: Add State Items for a Window as neccessary
//	//////////////////////////////////////////////////////////////////////
//	class HookItem 
//	{	
//	public:	
//		HWND m_hWnd;
//		WNDPROC	m_HookWndProc;
//		WNDPROC	m_DefWndProc;
//		ButtonState m_btnState;
//		
//		// Constructor
//		HookItem(HWND hWnd, WNDPROC hookWndProc, WNDPROC defWndProc):
//		m_hWnd(hWnd),
//		m_HookWndProc(hookWndProc),
//		m_DefWndProc(defWndProc),
//		m_btnState(BUTTON_UP)
//		{		
//		}			
//	};
//	//////////////////////////////////////////////////////////////////////
//	// Clss: HookList
//	// Desc: Generic List / Custom written list for the sake of speed.
//	//		 Hook list is made up of individual HookItems.
//	//
//	// Note: You can use GetNext() to iterate thru all the items in the list.
//	//		 ~adding or removing an item causes GetNext() to start over.
//	//////////////////////////////////////////////////////////////////////
//	class HookList
//	{
//	public:
//		//////////////////////////////////////////////////////////////////////
//		// Func: AddItem()
//		// Desc: Adds a HookItem to the List
//		//////////////////////////////////////////////////////////////////////
//		void AddItem(HookItem* pItem)
//		{
//			m_NbrItems++;			
//
//			if ( m_pHookItem == NULL )
//				m_pHookItem = (HookItem*) malloc( m_NbrItems * sizeof( HookItem ) );
//			else
//				m_pHookItem = (HookItem*) realloc( m_pHookItem, m_NbrItems * sizeof( HookItem ) );
//
//			log(pItem->m_hWnd,"hase been added");
//
//			memcpy( m_pHookItem+(m_NbrItems-1), pItem, sizeof( HookItem ) ); 
//		}
//		//////////////////////////////////////////////////////////////////////
//		// Func: GetItem()
//		// Desc: Get a HookItem from the List
//		//////////////////////////////////////////////////////////////////////
//		HookItem* GetItem(HWND hWnd)
//		{
//			UINT i;
//			HookItem * pItem = m_pHookItem;
//			for( i=0; i<m_NbrItems && pItem->m_hWnd!=hWnd; i++, pItem++ );	
//			return ( i < m_NbrItems ) ? pItem : NULL;
//		}
//		//////////////////////////////////////////////////////////////////////
//		// Func: DelItem()
//		// Desc: Deletes a HookItem from the List
//		//////////////////////////////////////////////////////////////////////
//		void DelItem(HWND hWnd)
//		{
//			UINT i;
//			HookItem * pItem = m_pHookItem;
//			for( i =0; i<m_NbrItems && pItem->m_hWnd!=hWnd; i++, pItem++ );
//			if ( i < m_NbrItems )
//			{
//				m_NbrItems--;
//				memcpy( pItem, pItem+1, ( m_NbrItems - i ) * sizeof( HookItem ) );
//				m_pHookItem = (HookItem*) realloc( m_pHookItem, m_NbrItems * sizeof( HookItem ) ); 
//
//				log(pItem->m_hWnd,"hase been deleted");
//			}
//		}
//		//////////////////////////////////////////////////////////////////////
//		// Func: DelAllItems()
//		// Desc: Deletes all HookItems from the List
//		//////////////////////////////////////////////////////////////////////
//		void DelAllItems()
//		{
//			if ( m_pHookItem != NULL )
//				free( m_pHookItem );
//			m_pHookItem = NULL;
//			m_NbrItems  = 0;						
//		}
//		//////////////////////////////////////////////////////////////////////
//		// Func: UnhookAllItems()
//		// Desc: Responsible for iterating through entire list and 'unhooking'
//		//		 the WndProc function of every HookItem
//		//
//		// Note: has to be put in here since the list has to be iterated here
//		//////////////////////////////////////////////////////////////////////
//		void UnhookAllItems()
//		{
//			HookItem * pItem;
//			
//			while ( m_NbrItems > 0 )
//			{
//				pItem = m_pHookItem+(m_NbrItems-1);
//
//				// Unhook window
//				HWND hWnd = pItem->m_hWnd;
//				
//				log(hWnd,"Unhooking...");
//				SetWindowLong( hWnd, GWL_WNDPROC, (LONG) pItem->m_DefWndProc );							
//				SendMessage( hWnd, WM_NCPAINT, 1, 0 );
//				log(hWnd,"Sending WM_NCPAINT message...");
//				
//				// Delete item
//				DelItem( hWnd );
//			}					
//		}
//		//////////////////////////////////////////////////////////////////////
//		// Func: CleanUp()
//		// Desc: Unhooks all HookItems in the list and deletes the list
//		//////////////////////////////////////////////////////////////////////
//		void CleanUp()
//		{
//			UnhookAllItems();
//			DelAllItems();
//		}
//		//////////////////////////////////////////////////////////////////////
//		//******************************************************************** 
//		// Construction / Destruction
//		//******************************************************************** 
//		//////////////////////////////////////////////////////////////////////
//		HookList():m_NbrItems(0),m_pHookItem(NULL){}
//		~HookList(){CleanUp();}
//
//	protected:
//		UINT m_NbrItems;
//		HookItem* m_pHookItem;				
//	};
//}